Crate r2r

source ·
Expand description

§Easy to use, runtime-agnostic async rust bindings for ROS2.

Minimal bindings for ROS2 that do not require hooking in to the ROS2 build infrastructure – cargo build is all you need. Convenience Rust types are created by calling into the c introspection libraries. This circumvents the ROS2 .msg/.idl pipeline by relying on already generated C code. By default, the behavior is to build bindings to the RCL and all message types that can be found in the currently sourced ros environment.

§What works?

  • Up to date with ROS2 Dashing Eloquent Foxy Galactic Humble
  • Building Rust types
  • Publish/subscribe
  • Services
  • Actions
  • Parameter handling

After having sourced ROS2 (see README for more details), you can try the following example:

use futures::executor::LocalPool;
use futures::future;
use futures::stream::StreamExt;
use futures::task::LocalSpawnExt;
use r2r::QosProfile;

fn main() -> Result<(), Box<dyn std::error::Error>> {
   let ctx = r2r::Context::create()?;
   let mut node = r2r::Node::create(ctx, "node", "namespace")?;
   let subscriber = node.subscribe::<r2r::std_msgs::msg::String>("/topic", QosProfile::default())?;
   let publisher = node.create_publisher::<r2r::std_msgs::msg::String>("/topic", QosProfile::default())?;
   let mut timer = node.create_wall_timer(std::time::Duration::from_millis(1000))?;

   // Set up a simple task executor.
   let mut pool = LocalPool::new();
   let spawner = pool.spawner();

   // Run the subscriber in one task, printing the messages
   spawner.spawn_local(async move {
       subscriber.for_each(|msg| {
           println!("got new msg: {}", msg.data);
           future::ready(())
       }).await
   })?;

   // Run the publisher in another task
   spawner.spawn_local(async move {
       let mut counter = 0;
       loop {
           let _elapsed = timer.tick().await.unwrap();
           let msg = r2r::std_msgs::msg::String { data: format!("Hello, world! ({})", counter) };
           publisher.publish(&msg).unwrap();
           counter += 1;
       }
   })?;

   // Main loop spins ros.
   loop {
       node.spin_once(std::time::Duration::from_millis(100));
       pool.run_until_stalled();
   }
}

Re-exports§

Modules§

Macros§

Structs§

Enums§

Constants§

Traits§

Type Aliases§

Derive Macros§

  • Derives RosParams trait for a structure to use it with r2r::Node::make_derived_parameter_handler().